home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 441 / dlibs12 / ctlcnv.c < prev    next >
C/C++ Source or Header  |  1990-11-23  |  2KB  |  89 lines

  1. #include <stdio.h>
  2. /*
  3.  * note: <ctype.h> is explicitly NOT #include'd so that the FUNCTION
  4.  *     version of toupper() will be loaded instead of the macro.
  5.  *     This is to prevent "side-effect" problems.
  6.  */
  7.  
  8. extern    char    _numstr[];        /* string of hexadecimal digits */
  9.  
  10. char *ctlcnv(string)
  11.     char *string;
  12.     {
  13.     register char *p, *q, c;
  14.     register int i, n;
  15.  
  16.     p = q = string;
  17.     while(*q)
  18.         {
  19.         if(*q == '\\')
  20.             {
  21.             switch(*++q)
  22.                 {
  23.                 case 'n':    /* newline or linefeed */
  24.                     *p++ = '\n';
  25.                     break;
  26.                 case 'r':    /* carriage return */
  27.                     *p++ = '\r';
  28.                     break;
  29.                 case 'b':    /* backspace */
  30.                     *p++ = '\b';
  31.                     break;
  32.                 case 't':    /* horizontal tab */
  33.                     *p++ = '\t';
  34.                     break;
  35.                 case 'v':    /* vertical tab */
  36.                     *p++ = '\013';
  37.                     break;
  38.                 case 'f':    /* form feed */
  39.                     *p++ = '\f';
  40.                     break;
  41.                 case 'a':    /* alarm (bell) */
  42.                     *p++ = '\007';
  43.                     break;
  44.                 case '0':    /* octal constant */
  45.                 case '1':
  46.                 case '2':
  47.                 case '3':
  48.                 case '4':
  49.                 case '5':
  50.                 case '6':
  51.                 case '7':
  52.                     c = (*q - '0');
  53.                     i = 0;
  54.                     n = 3;
  55.                     do
  56.                         {
  57.                         i = (i<<3) + c;
  58.                         c = (*++q - '0');
  59.                         }
  60.                         while((--n)
  61.                            && (c >= 0) 
  62.                            && (c < 8));
  63.                     *p++ = i;
  64.                     --q;
  65.                     break;
  66.                 case 'x':    /* hexadecimal constant */
  67.                     i = 0;
  68.                     n = 2;
  69.                     while((n--)
  70.                        && ((c = strpos(_numstr,
  71.                                toupper(*++q))) >= 0))
  72.                         i = (i << 4) + c;
  73.                     *p++ = i;
  74.                     --q;
  75.                     break;
  76.                 case '\n':    /* "folded" line */
  77.                     break;
  78.                 default:
  79.                     *p++ = *q;
  80.                 }
  81.             }
  82.         else
  83.             *p++ = *q;
  84.         ++q;
  85.         }
  86.     *p = '\0';
  87.     return(string);
  88.     }
  89.